home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / SLAX 6.0.8 / slax-6.0.8.iso / slax / base / 006-devel.lzm / usr / include / lcms.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-03-14  |  75.2 KB  |  2,045 lines

  1. //
  2. //  Little cms
  3. //  Copyright (C) 1998-2007 Marti Maria
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining 
  6. // a copy of this software and associated documentation files (the "Software"), 
  7. // to deal in the Software without restriction, including without limitation 
  8. // the rights to use, copy, modify, merge, publish, distribute, sublicense, 
  9. // and/or sell copies of the Software, and to permit persons to whom the Software 
  10. // is furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in 
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
  16. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  17. // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
  18. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
  19. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
  20. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
  21. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22.  
  23. // Version 1.17
  24.  
  25. #ifndef __cms_H
  26.  
  27. // ********** Configuration toggles ****************************************
  28.  
  29. //   Optimization mode.
  30. //
  31. // Note that USE_ASSEMBLER Is fastest by far, but it is limited to Pentium.
  32. // USE_FLOAT are the generic floating-point routines. USE_C should work on
  33. // virtually any machine.
  34.  
  35. //#define USE_FLOAT        1
  36. // #define USE_C            1
  37. #define USE_ASSEMBLER    1
  38.  
  39. // Define this if you are using this package as a DLL (windows only)
  40.  
  41. // #define LCMS_DLL     1
  42. // #define LCMS_DLL_BUILD   1
  43.  
  44. // Uncomment if you are trying the engine in a non-windows environment
  45. // like linux, SGI, VAX, FreeBSD, BeOS, etc. 
  46. #define NON_WINDOWS  1
  47.  
  48. // Uncomment this one if you are using big endian machines (only meaningful
  49. // when NON_WINDOWS is used)
  50. // #define USE_BIG_ENDIAN   1
  51.  
  52. // Uncomment this one if your compiler/machine does support the
  53. // "long long" type This will speedup fixed point math. (USE_C only)
  54. #define USE_INT64        1
  55.  
  56. // Some machines does not have a reliable 'swab' function. Usually
  57. // leave commented unless the testbed diagnoses the contrary.
  58. // #define USE_CUSTOM_SWAB   1
  59.  
  60. // Uncomment this if your compiler supports inline
  61. #define USE_INLINE  1
  62.  
  63. // Uncomment this if your compiler doesn't work with fast floor function
  64. // #define USE_DEFAULT_FLOOR_CONVERSION  1
  65.  
  66. // Uncomment this line on multithreading environments
  67. // #define USE_PTHREADS    1
  68.  
  69. // Uncomment this line if you want lcms to use the black point tag in profile, 
  70. // if commented, lcms will compute the black point by its own. 
  71. // It is safer to leve it commented out
  72. // #define HONOR_BLACK_POINT_TAG    1
  73.  
  74. // ********** End of configuration toggles ******************************
  75.  
  76. #define LCMS_VERSION        117
  77.  
  78. // Microsoft VisualC++
  79.  
  80. // Deal with Microsoft's attempt at deprecating C standard runtime functions 
  81. #ifdef _MSC_VER
  82. #    undef NON_WINDOWS
  83. #    if (_MSC_VER >= 1400)
  84. #      ifndef _CRT_SECURE_NO_DEPRECATE
  85. #        define _CRT_SECURE_NO_DEPRECATE 1
  86. #      endif
  87. #    endif
  88. #endif
  89.  
  90. // Borland C 
  91.  
  92. #ifdef __BORLANDC__
  93. #    undef NON_WINDOWS
  94. #endif
  95.  
  96. #include <stdio.h>
  97. #include <stdlib.h>
  98. #include <math.h>
  99. #include <assert.h>
  100. #include <stdarg.h>
  101. #include <time.h>
  102.  
  103. // Metroworks CodeWarrior
  104. #ifdef __MWERKS__ 
  105. #   define unlink remove
  106. #   if WIN32 
  107. #       define USE_CUSTOM_SWAB 1
  108. #       undef  NON_WINDOWS
  109. #   else
  110. #       define NON_WINDOWS   1
  111. #   endif
  112. #endif
  113.  
  114.  
  115. // Here comes the Non-Windows settings
  116.  
  117. #ifdef NON_WINDOWS
  118.  
  119. // Non windows environments. Also avoid indentation on includes.
  120.  
  121. #ifdef USE_PTHREADS
  122. #   include <pthread.h>
  123. typedef    pthread_rwlock_t      LCMS_RWLOCK_T;
  124. #   define LCMS_CREATE_LOCK(x)       pthread_rwlock_init((x), NULL) 
  125. #   define LCMS_FREE_LOCK(x)         pthread_rwlock_destroy((x))
  126. #   define LCMS_READ_LOCK(x)         pthread_rwlock_rdlock((x))
  127. #   define LCMS_WRITE_LOCK(x)        pthread_rwlock_wrlock((x))
  128. #   define LCMS_UNLOCK(x)            pthread_rwlock_unlock((x))
  129. #endif
  130.  
  131. #undef LCMS_DLL
  132.  
  133. #ifdef  USE_ASSEMBLER
  134. #  undef  USE_ASSEMBLER
  135. #  define USE_C               1
  136. #endif
  137.  
  138. #ifdef _HOST_BIG_ENDIAN
  139. #   define USE_BIG_ENDIAN      1
  140. #endif
  141.  
  142. #if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__)
  143. #   define USE_BIG_ENDIAN      1
  144. #endif
  145.  
  146. #if TARGET_CPU_PPC
  147. #   define USE_BIG_ENDIAN   1
  148. #endif
  149.  
  150. #if macintosh
  151. # ifndef __LITTLE_ENDIAN__
  152. #   define USE_BIG_ENDIAN      1
  153. # endif
  154. #endif
  155.  
  156. #if __BIG_ENDIAN__
  157. #   define USE_BIG_ENDIAN      1
  158. #endif
  159.  
  160. #ifdef WORDS_BIGENDIAN
  161. #   define USE_BIG_ENDIAN      1
  162. #endif
  163.  
  164. #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
  165. #  include <sys/types.h>
  166. #  define USE_INT64           1
  167. #  define LCMSSLONGLONG       int64_t
  168. #  define LCMSULONGLONG       u_int64_t
  169. #endif
  170.  
  171. #ifdef USE_INT64
  172. #   ifndef LCMSULONGLONG
  173. #       define LCMSULONGLONG unsigned long long
  174. #       define LCMSSLONGLONG long long
  175. #   endif
  176. #endif
  177.  
  178. #if !defined(__INTEGRITY)
  179. #   include <memory.h>
  180. #endif
  181.  
  182. #include <string.h>
  183.  
  184. #if defined(__GNUC__) || defined(__FreeBSD__)
  185. #   include <unistd.h>
  186. #endif
  187.  
  188. #ifndef LCMS_WIN_TYPES_ALREADY_DEFINED
  189.  
  190. typedef unsigned char BYTE, *LPBYTE; 
  191. typedef unsigned short WORD, *LPWORD;
  192. typedef unsigned long DWORD, *LPDWORD;
  193. typedef char *LPSTR;
  194. typedef void *LPVOID;
  195.  
  196. #define ZeroMemory(p,l)     memset((p),0,(l))
  197. #define CopyMemory(d,s,l)   memcpy((d),(s),(l))
  198. #define FAR
  199.  
  200. #ifndef stricmp
  201. #   define stricmp strcasecmp
  202. #endif
  203.  
  204.  
  205. #ifndef FALSE
  206. #       define FALSE 0
  207. #endif
  208. #ifndef TRUE
  209. #       define TRUE  1
  210. #endif
  211.  
  212. #define LOWORD(l)    ((WORD)(l))
  213. #define HIWORD(l)    ((WORD)((DWORD)(l) >> 16))
  214.  
  215. #ifndef MAX_PATH
  216. #       define MAX_PATH     (256)
  217. #endif
  218.  
  219. #define cdecl
  220. #endif
  221.  
  222. // The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). 
  223.  
  224. #define LCMS_INLINE static inline
  225.  
  226. #else
  227.  
  228. // Win32 stuff
  229.  
  230. #ifndef WIN32_LEAN_AND_MEAN
  231. #  define WIN32_LEAN_AND_MEAN
  232. #endif
  233.  
  234. #include <windows.h>
  235.  
  236. #ifdef _WIN64
  237. # ifdef USE_ASSEMBLER
  238. #    undef  USE_ASSEMBLER
  239. #    define USE_C           1
  240. # endif
  241. #endif
  242.  
  243. #ifdef  USE_INT64
  244. #  ifndef LCMSULONGLONG
  245. #    define LCMSULONGLONG unsigned __int64
  246. #    define LCMSSLONGLONG __int64
  247. #  endif
  248. #endif
  249.  
  250. // This works for both VC & BorlandC
  251. #define LCMS_INLINE __inline
  252.  
  253. #ifdef USE_PTHREADS
  254. typedef CRITICAL_SECTION LCMS_RWLOCK_T;
  255. #   define LCMS_CREATE_LOCK(x)       InitializeCriticalSection((x))
  256. #   define LCMS_FREE_LOCK(x)         DeleteCriticalSection((x))
  257. #   define LCMS_READ_LOCK(x)         EnterCriticalSection((x))
  258. #   define LCMS_WRITE_LOCK(x)        EnterCriticalSection((x))
  259. #   define LCMS_UNLOCK(x)            LeaveCriticalSection((x))
  260. #endif
  261.  
  262. #endif
  263.  
  264. #ifndef USE_PTHREADS
  265. typedef int LCMS_RWLOCK_T;             
  266. #   define LCMS_CREATE_LOCK(x)       
  267. #   define LCMS_FREE_LOCK(x)         
  268. #   define LCMS_READ_LOCK(x)         
  269. #   define LCMS_WRITE_LOCK(x)        
  270. #   define LCMS_UNLOCK(x)            
  271. #endif
  272.  
  273. // Base types
  274.  
  275. typedef int   LCMSBOOL;
  276. typedef void* LCMSHANDLE;
  277.  
  278. #include "icc34.h"          // ICC header file
  279.  
  280.  
  281. // Some tag & type additions
  282.  
  283. #define lcmsSignature                  ((icSignature)           0x6c636d73L)
  284.  
  285. #define icSigLuvKData                  ((icColorSpaceSignature) 0x4C75764BL)  // 'LuvK'
  286.  
  287. #define icSigHexachromeData            ((icColorSpaceSignature) 0x4d434836L)  // MCH6
  288. #define icSigHeptachromeData           ((icColorSpaceSignature) 0x4d434837L)  // MCH7
  289. #define icSigOctachromeData            ((icColorSpaceSignature) 0x4d434838L)  // MCH8
  290.  
  291. #define icSigMCH5Data                  ((icColorSpaceSignature) 0x4d434835L)  // MCH5
  292. #define icSigMCH6Data                  ((icColorSpaceSignature) 0x4d434836L)  // MCH6
  293. #define icSigMCH7Data                  ((icColorSpaceSignature) 0x4d434837L)  // MCH7
  294. #define icSigMCH8Data                  ((icColorSpaceSignature) 0x4d434838L)  // MCH8
  295. #define icSigMCH9Data                  ((icColorSpaceSignature) 0x4d434839L)  // MCH9
  296. #define icSigMCHAData                  ((icColorSpaceSignature) 0x4d434841L)  // MCHA
  297. #define icSigMCHBData                  ((icColorSpaceSignature) 0x4d434842L)  // MCHB
  298. #define icSigMCHCData                  ((icColorSpaceSignature) 0x4d434843L)  // MCHC
  299. #define icSigMCHDData                  ((icColorSpaceSignature) 0x4d434844L)  // MCHD
  300. #define icSigMCHEData                  ((icColorSpaceSignature) 0x4d434845L)  // MCHE
  301. #define icSigMCHFData                  ((icColorSpaceSignature) 0x4d434846L)  // MCHF
  302.  
  303. #define icSigChromaticityTag            ((icTagSignature) 0x6368726dL) // As per Addendum 2 to Spec. ICC.1:1998-09
  304. #define icSigChromaticAdaptationTag     ((icTagSignature) 0x63686164L) // 'chad'
  305. #define icSigColorantTableTag           ((icTagSignature) 0x636c7274L) // 'clrt'
  306. #define icSigColorantTableOutTag        ((icTagSignature) 0x636c6f74L) // 'clot'
  307.  
  308. #define icSigParametricCurveType        ((icTagTypeSignature) 0x70617261L)  // parametric (ICC 4.0)
  309. #define icSigMultiLocalizedUnicodeType  ((icTagTypeSignature) 0x6D6C7563L)
  310. #define icSigS15Fixed16ArrayType        ((icTagTypeSignature) 0x73663332L) 
  311. #define icSigChromaticityType           ((icTagTypeSignature) 0x6368726dL)
  312. #define icSiglutAtoBType                ((icTagTypeSignature) 0x6d414220L)  // mAB 
  313. #define icSiglutBtoAType                ((icTagTypeSignature) 0x6d424120L)  // mBA 
  314. #define icSigColorantTableType          ((icTagTypeSignature) 0x636c7274L)  // clrt
  315.  
  316.  
  317. typedef struct {
  318.     icUInt8Number       gridPoints[16]; // Number of grid points in each dimension.  
  319.     icUInt8Number       prec;           // Precision of data elements in bytes.      
  320.     icUInt8Number       pad1;
  321.     icUInt8Number       pad2;
  322.     icUInt8Number       pad3;
  323.     /*icUInt8Number     data[icAny];     Data follows see spec for size */
  324. } icCLutStruct;
  325.  
  326. // icLutAtoB  
  327. typedef struct {
  328.     icUInt8Number       inputChan;      // Number of input channels     
  329.     icUInt8Number       outputChan;     // Number of output channels    
  330.     icUInt8Number       pad1;
  331.     icUInt8Number       pad2;
  332.     icUInt32Number      offsetB;        // Offset to first "B" curve    
  333.     icUInt32Number      offsetMat;      // Offset to matrix             
  334.     icUInt32Number      offsetM;        // Offset to first "M" curve    
  335.     icUInt32Number      offsetC;        // Offset to CLUT               
  336.     icUInt32Number      offsetA;        // Offset to first "A" curve    
  337.     /*icUInt8Number     data[icAny];     Data follows see spec for size */
  338. } icLutAtoB;
  339.  
  340. // icLutBtoA  
  341. typedef struct {
  342.     icUInt8Number       inputChan;      // Number of input channels     
  343.     icUInt8Number       outputChan;     // Number of output channels    
  344.     icUInt8Number       pad1;
  345.     icUInt8Number       pad2;
  346.     icUInt32Number      offsetB;        // Offset to first "B" curve    
  347.     icUInt32Number      offsetMat;      // Offset to matrix             
  348.     icUInt32Number      offsetM;        // Offset to first "M" curve    
  349.     icUInt32Number      offsetC;        // Offset to CLUT               
  350.     icUInt32Number      offsetA;        // Offset to first "A" curve    
  351.     /*icUInt8Number     data[icAny];     Data follows see spec for size */
  352. } icLutBtoA;
  353.  
  354.  
  355.  
  356.  
  357.  
  358. #ifdef __cplusplus
  359. extern "C" {
  360. #endif
  361.  
  362. // Calling convention
  363.  
  364. #ifdef NON_WINDOWS
  365. #  define LCMSEXPORT
  366. #  define LCMSAPI
  367. #else
  368. # ifdef LCMS_DLL
  369. #   ifdef __BORLANDC__
  370. #      define LCMSEXPORT __stdcall _export
  371. #      define LCMSAPI
  372. #   else
  373.        // VC++
  374. #       define LCMSEXPORT  _stdcall
  375. #       ifdef LCMS_DLL_BUILD
  376. #           define LCMSAPI     __declspec(dllexport)
  377. #       else
  378. #           define LCMSAPI     __declspec(dllimport)
  379. #       endif
  380. #   endif
  381. # else
  382. #       define LCMSEXPORT cdecl
  383. #       define LCMSAPI
  384. # endif
  385. #endif
  386.  
  387. #ifdef  USE_ASSEMBLER
  388. #ifdef __BORLANDC__
  389.  
  390. #      define ASM     asm
  391. #      define RET(v)  return(v)
  392. #else
  393.       // VC++
  394. #      define ASM     __asm
  395. #      define RET(v)  return
  396. #endif
  397. #endif
  398.  
  399. #ifdef _MSC_VER
  400. #ifndef  stricmp
  401. #      define stricmp _stricmp
  402. #endif
  403. #ifndef unlink
  404. #      define unlink  _unlink
  405. #endif
  406. #ifndef swab
  407. #      define swab    _swab
  408. #endif
  409. #ifndef itoa
  410. #       define itoa   _itoa
  411. #endif
  412. #ifndef fileno
  413. #       define fileno   _fileno
  414. #endif
  415. #ifndef strupr
  416. #       define strupr   _strupr
  417. #endif
  418. #ifndef hypot
  419. #       define hypot    _hypot
  420. #endif
  421. #ifndef snprintf
  422. #       define snprintf  _snprintf
  423. #endif
  424. #ifndef vsnprintf
  425. #       define vsnprintf  _vsnprintf
  426. #endif
  427.  
  428.  
  429. #endif
  430.  
  431.  
  432. #ifndef M_PI
  433. #       define M_PI    3.14159265358979323846
  434. #endif
  435.  
  436. #ifndef LOGE
  437. #       define LOGE   0.4342944819   
  438. #endif
  439.  
  440. // ********** Little cms API ***************************************************
  441.  
  442. typedef LCMSHANDLE cmsHPROFILE;        // Opaque typedefs to hide internals
  443. typedef LCMSHANDLE cmsHTRANSFORM;
  444.  
  445. #define MAXCHANNELS  16                // Maximum number of channels
  446.  
  447. // Format of pixel is defined by one DWORD, using bit fields as follows
  448. //
  449. //            TTTTT U Y F P X S EEE CCCC BBB
  450. //
  451. //            T: Pixeltype
  452. //            F: Flavor  0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
  453. //            P: Planar? 0=Chunky, 1=Planar
  454. //            X: swap 16 bps endianess?
  455. //            S: Do swap? ie, BGR, KYMC
  456. //            E: Extra samples
  457. //            C: Channels (Samples per pixel)
  458. //            B: Bytes per sample
  459. //            Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
  460.  
  461.  
  462. #define COLORSPACE_SH(s)       ((s) << 16)
  463. #define SWAPFIRST_SH(s)        ((s) << 14)
  464. #define FLAVOR_SH(s)           ((s) << 13)
  465. #define PLANAR_SH(p)           ((p) << 12)
  466. #define ENDIAN16_SH(e)         ((e) << 11)
  467. #define DOSWAP_SH(e)           ((e) << 10)
  468. #define EXTRA_SH(e)            ((e) << 7)
  469. #define CHANNELS_SH(c)         ((c) << 3)
  470. #define BYTES_SH(b)            (b)
  471.  
  472. // Pixel types
  473.  
  474. #define PT_ANY       0    // Don't check colorspace
  475.                           // 1 & 2 are reserved
  476. #define PT_GRAY      3
  477. #define PT_RGB       4
  478. #define PT_CMY       5
  479. #define PT_CMYK      6
  480. #define PT_YCbCr     7
  481. #define PT_YUV       8      // Lu'v'
  482. #define PT_XYZ       9
  483. #define PT_Lab       10
  484. #define PT_YUVK      11     // Lu'v'K
  485. #define PT_HSV       12
  486. #define PT_HLS       13
  487. #define PT_Yxy       14
  488. #define PT_HiFi      15
  489. #define PT_HiFi7     16
  490. #define PT_HiFi8     17
  491. #define PT_HiFi9     18
  492. #define PT_HiFi10    19
  493. #define PT_HiFi11    20
  494. #define PT_HiFi12    21
  495. #define PT_HiFi13    22
  496. #define PT_HiFi14    23
  497. #define PT_HiFi15    24
  498.  
  499. #define NOCOLORSPACECHECK(x)    ((x) & 0xFFFF)
  500.  
  501. // Some (not all!) representations
  502.  
  503. #ifndef TYPE_RGB_8      // TYPE_RGB_8 is a very common identifier, so don't include ours
  504.                         // if user has it already defined.
  505.  
  506. #define TYPE_GRAY_8            (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
  507. #define TYPE_GRAY_8_REV        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
  508. #define TYPE_GRAY_16           (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
  509. #define TYPE_GRAY_16_REV       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
  510. #define TYPE_GRAY_16_SE        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
  511. #define TYPE_GRAYA_8           (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
  512. #define TYPE_GRAYA_16          (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
  513. #define TYPE_GRAYA_16_SE       (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
  514. #define TYPE_GRAYA_8_PLANAR    (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
  515. #define TYPE_GRAYA_16_PLANAR   (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
  516.  
  517. #define TYPE_RGB_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
  518. #define TYPE_RGB_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  519. #define TYPE_BGR_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
  520. #define TYPE_BGR_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
  521. #define TYPE_RGB_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
  522. #define TYPE_RGB_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  523. #define TYPE_RGB_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  524. #define TYPE_BGR_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
  525. #define TYPE_BGR_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
  526. #define TYPE_BGR_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  527.  
  528. #define TYPE_RGBA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
  529. #define TYPE_RGBA_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  530. #define TYPE_RGBA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
  531. #define TYPE_RGBA_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  532. #define TYPE_RGBA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  533.  
  534. #define TYPE_ARGB_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
  535. #define TYPE_ARGB_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
  536.  
  537. #define TYPE_ABGR_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
  538. #define TYPE_ABGR_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
  539. #define TYPE_ABGR_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
  540. #define TYPE_ABGR_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  541.  
  542. #define TYPE_BGRA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
  543. #define TYPE_BGRA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
  544. #define TYPE_BGRA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
  545.  
  546. #define TYPE_CMY_8             (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
  547. #define TYPE_CMY_8_PLANAR      (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  548. #define TYPE_CMY_16            (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
  549. #define TYPE_CMY_16_PLANAR     (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  550. #define TYPE_CMY_16_SE         (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  551.  
  552. #define TYPE_CMYK_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
  553. #define TYPE_CMYKA_8           (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))  
  554. #define TYPE_CMYK_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
  555. #define TYPE_YUVK_8            TYPE_CMYK_8_REV
  556. #define TYPE_CMYK_8_PLANAR     (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
  557. #define TYPE_CMYK_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
  558. #define TYPE_CMYK_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
  559. #define TYPE_YUVK_16           TYPE_CMYK_16_REV
  560. #define TYPE_CMYK_16_PLANAR    (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
  561. #define TYPE_CMYK_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
  562.  
  563. #define TYPE_KYMC_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
  564. #define TYPE_KYMC_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
  565. #define TYPE_KYMC_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  566.  
  567. #define TYPE_KCMY_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
  568. #define TYPE_KCMY_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
  569. #define TYPE_KCMY_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
  570. #define TYPE_KCMY_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
  571. #define TYPE_KCMY_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
  572.  
  573.  
  574. // HiFi separations, Thanks to Steven Greaves for providing the code,
  575. // the colorspace is not checked
  576. #define TYPE_CMYK5_8           (CHANNELS_SH(5)|BYTES_SH(1))
  577. #define TYPE_CMYK5_16          (CHANNELS_SH(5)|BYTES_SH(2))
  578. #define TYPE_CMYK5_16_SE       (CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
  579. #define TYPE_KYMC5_8           (CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
  580. #define TYPE_KYMC5_16          (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
  581. #define TYPE_KYMC5_16_SE       (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  582.  
  583. #define TYPE_CMYKcm_8          (CHANNELS_SH(6)|BYTES_SH(1))
  584. #define TYPE_CMYKcm_8_PLANAR   (CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
  585. #define TYPE_CMYKcm_16         (CHANNELS_SH(6)|BYTES_SH(2))
  586. #define TYPE_CMYKcm_16_PLANAR  (CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
  587. #define TYPE_CMYKcm_16_SE      (CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
  588.  
  589. // Separations with more than 6 channels aren't very standarized,
  590. // Except most start with CMYK and add other colors, so I just used
  591. // then total number of channels after CMYK i.e CMYK8_8
  592.  
  593. #define TYPE_CMYK7_8           (CHANNELS_SH(7)|BYTES_SH(1))
  594. #define TYPE_CMYK7_16          (CHANNELS_SH(7)|BYTES_SH(2))
  595. #define TYPE_CMYK7_16_SE       (CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
  596. #define TYPE_KYMC7_8           (CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
  597. #define TYPE_KYMC7_16          (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
  598. #define TYPE_KYMC7_16_SE       (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  599. #define TYPE_CMYK8_8           (CHANNELS_SH(8)|BYTES_SH(1))
  600. #define TYPE_CMYK8_16          (CHANNELS_SH(8)|BYTES_SH(2))
  601. #define TYPE_CMYK8_16_SE       (CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
  602. #define TYPE_KYMC8_8           (CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
  603. #define TYPE_KYMC8_16          (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
  604. #define TYPE_KYMC8_16_SE       (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  605. #define TYPE_CMYK9_8           (CHANNELS_SH(9)|BYTES_SH(1))
  606. #define TYPE_CMYK9_16          (CHANNELS_SH(9)|BYTES_SH(2))
  607. #define TYPE_CMYK9_16_SE       (CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
  608. #define TYPE_KYMC9_8           (CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
  609. #define TYPE_KYMC9_16          (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
  610. #define TYPE_KYMC9_16_SE       (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  611. #define TYPE_CMYK10_8          (CHANNELS_SH(10)|BYTES_SH(1))
  612. #define TYPE_CMYK10_16         (CHANNELS_SH(10)|BYTES_SH(2))
  613. #define TYPE_CMYK10_16_SE      (CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
  614. #define TYPE_KYMC10_8          (CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
  615. #define TYPE_KYMC10_16         (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
  616. #define TYPE_KYMC10_16_SE      (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  617. #define TYPE_CMYK11_8          (CHANNELS_SH(11)|BYTES_SH(1))
  618. #define TYPE_CMYK11_16         (CHANNELS_SH(11)|BYTES_SH(2))
  619. #define TYPE_CMYK11_16_SE      (CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
  620. #define TYPE_KYMC11_8          (CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
  621. #define TYPE_KYMC11_16         (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
  622. #define TYPE_KYMC11_16_SE      (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  623. #define TYPE_CMYK12_8          (CHANNELS_SH(12)|BYTES_SH(1))
  624. #define TYPE_CMYK12_16         (CHANNELS_SH(12)|BYTES_SH(2))
  625. #define TYPE_CMYK12_16_SE      (CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
  626. #define TYPE_KYMC12_8          (CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
  627. #define TYPE_KYMC12_16         (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
  628. #define TYPE_KYMC12_16_SE      (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
  629.  
  630. // Colorimetric
  631.  
  632. #define TYPE_XYZ_16            (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
  633. #define TYPE_Lab_8             (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
  634. #define TYPE_ALab_8            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1))
  635. #define TYPE_Lab_16            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
  636. #define TYPE_Yxy_16            (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
  637.  
  638. // YCbCr
  639.  
  640. #define TYPE_YCbCr_8           (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
  641. #define TYPE_YCbCr_8_PLANAR    (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  642. #define TYPE_YCbCr_16          (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
  643. #define TYPE_YCbCr_16_PLANAR   (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  644. #define TYPE_YCbCr_16_SE       (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  645.  
  646. // YUV
  647.  
  648. #define TYPE_YUV_8           (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
  649. #define TYPE_YUV_8_PLANAR    (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  650. #define TYPE_YUV_16          (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
  651. #define TYPE_YUV_16_PLANAR   (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  652. #define TYPE_YUV_16_SE       (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  653.  
  654. // HLS
  655.  
  656. #define TYPE_HLS_8           (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
  657. #define TYPE_HLS_8_PLANAR    (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  658. #define TYPE_HLS_16          (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
  659. #define TYPE_HLS_16_PLANAR   (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  660. #define TYPE_HLS_16_SE       (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  661.  
  662.  
  663. // HSV
  664.  
  665. #define TYPE_HSV_8           (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
  666. #define TYPE_HSV_8_PLANAR    (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
  667. #define TYPE_HSV_16          (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
  668. #define TYPE_HSV_16_PLANAR   (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
  669. #define TYPE_HSV_16_SE       (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
  670.  
  671. // Named color index. Only 16 bits allowed (don't check colorspace) 
  672.  
  673. #define TYPE_NAMED_COLOR_INDEX   (CHANNELS_SH(1)|BYTES_SH(2))
  674.  
  675. // Double values. Painful slow, but sometimes helpful. NOTE THAT 'BYTES' FIELD IS SET TO ZERO!
  676.  
  677. #define TYPE_XYZ_DBL        (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
  678. #define TYPE_Lab_DBL        (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
  679. #define TYPE_GRAY_DBL       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
  680. #define TYPE_RGB_DBL        (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
  681. #define TYPE_CMYK_DBL       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
  682.  
  683. #endif
  684.  
  685.  
  686. // Gamma table parameters
  687.  
  688. typedef struct {
  689.  
  690.     unsigned int Crc32;  // Has my table been touched?
  691.  
  692.     // Keep initial parameters for further serialization
  693.  
  694.     int          Type;
  695.     double       Params[10];
  696.  
  697.     }  LCMSGAMMAPARAMS, FAR* LPLCMSGAMMAPARAMS;
  698.     
  699. // Gamma tables.
  700.  
  701. typedef struct {
  702.  
  703.     LCMSGAMMAPARAMS Seed;    // Parameters used for table creation
  704.                       
  705.     // Table-based representation follows
  706.  
  707.     int  nEntries;
  708.     WORD GammaTable[1];
  709.  
  710.     } GAMMATABLE;
  711.  
  712. typedef GAMMATABLE FAR* LPGAMMATABLE;
  713.  
  714. // Sampled curves (1D)
  715. typedef struct {
  716.  
  717.     int     nItems;
  718.     double* Values;
  719.  
  720.     } SAMPLEDCURVE;
  721.  
  722. typedef SAMPLEDCURVE FAR* LPSAMPLEDCURVE;
  723.  
  724. // Vectors
  725. typedef struct {                // Float Vector
  726.  
  727.     double n[3];
  728.  
  729.     } VEC3;
  730.  
  731. typedef VEC3 FAR* LPVEC3;
  732.  
  733.  
  734. typedef struct {                // Matrix
  735.         
  736.     VEC3 v[3];
  737.     
  738.     } MAT3; 
  739.  
  740. typedef MAT3 FAR* LPMAT3;
  741.  
  742. // Colorspace values
  743. typedef struct {
  744.     
  745.         double X;
  746.         double Y;
  747.         double Z;
  748.  
  749.     } cmsCIEXYZ; 
  750.         
  751. typedef cmsCIEXYZ FAR* LPcmsCIEXYZ;
  752.  
  753. typedef struct {
  754.                
  755.         double x;
  756.         double y;
  757.         double Y;
  758.  
  759.     } cmsCIExyY;
  760.  
  761. typedef cmsCIExyY FAR* LPcmsCIExyY;
  762.  
  763. typedef struct {
  764.                
  765.         double L;
  766.         double a;               
  767.         double b;
  768.                
  769.     } cmsCIELab;
  770.  
  771. typedef cmsCIELab FAR* LPcmsCIELab;
  772.  
  773. typedef struct {
  774.                
  775.         double L;
  776.         double C;
  777.         double h;
  778.  
  779.     } cmsCIELCh;
  780.  
  781. typedef cmsCIELCh FAR* LPcmsCIELCh;
  782.  
  783. typedef struct {
  784.                
  785.         double J;
  786.         double C;
  787.         double h;
  788.  
  789.     } cmsJCh;
  790.  
  791. typedef cmsJCh FAR* LPcmsJCh;
  792.  
  793. // Primaries
  794. typedef struct {
  795.  
  796.         cmsCIEXYZ  Red;
  797.         cmsCIEXYZ  Green;
  798.         cmsCIEXYZ  Blue;
  799.  
  800.     } cmsCIEXYZTRIPLE;
  801.  
  802. typedef cmsCIEXYZTRIPLE FAR* LPcmsCIEXYZTRIPLE;
  803.  
  804.  
  805. typedef struct {
  806.               
  807.         cmsCIExyY  Red;
  808.         cmsCIExyY  Green;
  809.         cmsCIExyY  Blue;
  810.  
  811.     } cmsCIExyYTRIPLE;
  812.  
  813. typedef cmsCIExyYTRIPLE FAR* LPcmsCIExyYTRIPLE;
  814.  
  815.  
  816.  
  817. // Following ICC spec
  818.  
  819. #define D50X  (0.9642)  
  820. #define D50Y  (1.0)
  821. #define D50Z  (0.8249)
  822.  
  823. #define PERCEPTUAL_BLACK_X  (0.00336)
  824. #define PERCEPTUAL_BLACK_Y  (0.0034731)
  825. #define PERCEPTUAL_BLACK_Z  (0.00287)
  826.  
  827. // Does return pointers to constant structs
  828.  
  829. LCMSAPI LPcmsCIEXYZ LCMSEXPORT cmsD50_XYZ(void);
  830. LCMSAPI LPcmsCIExyY LCMSEXPORT cmsD50_xyY(void); 
  831.  
  832.  
  833. // Input/Output
  834.  
  835. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
  836. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize);
  837. LCMSAPI LCMSBOOL      LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
  838.  
  839. // Predefined run-time profiles
  840.  
  841. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateRGBProfile(LPcmsCIExyY WhitePoint,
  842.                                         LPcmsCIExyYTRIPLE Primaries,
  843.                                         LPGAMMATABLE TransferFunction[3]);
  844.  
  845. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateGrayProfile(LPcmsCIExyY WhitePoint,
  846.                                               LPGAMMATABLE TransferFunction);
  847.  
  848. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorSpace,
  849.                                                         LPGAMMATABLE TransferFunctions[]);
  850.  
  851. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature ColorSpace,
  852.                                                       double Limit);
  853.  
  854.  
  855. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint);
  856. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint);
  857.  
  858. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateXYZProfile(void);
  859. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreate_sRGBProfile(void);
  860.  
  861.  
  862.  
  863. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
  864.                                                      double Bright, 
  865.                                                      double Contrast,
  866.                                                      double Hue,
  867.                                                      double Saturation,
  868.                                                      int TempSrc, 
  869.                                                      int TempDest);
  870.  
  871. LCMSAPI cmsHPROFILE   LCMSEXPORT cmsCreateNULLProfile(void);
  872.  
  873.  
  874. // Colorimetric space conversions
  875.  
  876. LCMSAPI void          LCMSEXPORT cmsXYZ2xyY(LPcmsCIExyY Dest, const cmsCIEXYZ* Source);
  877. LCMSAPI void          LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, const cmsCIExyY* Source);
  878. LCMSAPI void          LCMSEXPORT cmsXYZ2Lab(LPcmsCIEXYZ WhitePoint, LPcmsCIELab Lab, const cmsCIEXYZ* xyz);
  879. LCMSAPI void          LCMSEXPORT cmsLab2XYZ(LPcmsCIEXYZ WhitePoint, LPcmsCIEXYZ xyz, const cmsCIELab* Lab);
  880. LCMSAPI void          LCMSEXPORT cmsLab2LCh(LPcmsCIELCh LCh, const cmsCIELab* Lab);
  881. LCMSAPI void          LCMSEXPORT cmsLCh2Lab(LPcmsCIELab Lab, const cmsCIELCh* LCh);
  882.  
  883.  
  884. // CIELab handling
  885.  
  886. LCMSAPI double        LCMSEXPORT cmsDeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  887. LCMSAPI double        LCMSEXPORT cmsCIE94DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  888. LCMSAPI double        LCMSEXPORT cmsBFDdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  889. LCMSAPI double        LCMSEXPORT cmsCMCdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
  890. LCMSAPI double        LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2, double Kl, double Kc, double Kh);
  891.  
  892. LCMSAPI void          LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin);
  893.  
  894. LCMSAPI LCMSBOOL      LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
  895.  
  896. LCMSAPI LCMSBOOL      LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
  897.                                                         LPcmsCIEXYZ SourceWhitePt,
  898.                                                         LPcmsCIEXYZ Illuminant,
  899.                                                         LPcmsCIEXYZ Value);
  900.  
  901. LCMSAPI LCMSBOOL      LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
  902.                                                         LPcmsCIExyY WhitePoint,
  903.                                                         LPcmsCIExyYTRIPLE Primaries);
  904.  
  905. // Viewing conditions 
  906.  
  907. #define AVG_SURROUND_4     0
  908. #define AVG_SURROUND       1
  909. #define DIM_SURROUND       2
  910. #define DARK_SURROUND      3
  911. #define CUTSHEET_SURROUND  4
  912.  
  913. #define D_CALCULATE             (-1)
  914. #define D_CALCULATE_DISCOUNT    (-2)
  915.  
  916. typedef struct {
  917.  
  918.               cmsCIEXYZ whitePoint;
  919.               double    Yb;
  920.               double    La;
  921.               int       surround;
  922.               double    D_value;
  923.  
  924.     } cmsViewingConditions;
  925.  
  926. typedef cmsViewingConditions FAR* LPcmsViewingConditions;
  927.  
  928. // CIECAM97s
  929.  
  930. LCMSAPI LCMSHANDLE    LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC2);
  931. LCMSAPI void          LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel);
  932. LCMSAPI void          LCMSEXPORT cmsCIECAM97sForward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
  933. LCMSAPI void          LCMSEXPORT cmsCIECAM97sReverse(LCMSHANDLE hModel, LPcmsJCh pIn,    LPcmsCIEXYZ pOut);
  934.  
  935.  
  936. // CIECAM02
  937.  
  938. LCMSAPI LCMSHANDLE    LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC);
  939. LCMSAPI void          LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel);
  940. LCMSAPI void          LCMSEXPORT cmsCIECAM02Forward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
  941. LCMSAPI void          LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn,    LPcmsCIEXYZ pOut);
  942.  
  943.  
  944. // Gamma
  945.  
  946. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsBuildGamma(int nEntries, double Gamma);
  947. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]);
  948. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsAllocGamma(int nEntries);
  949. LCMSAPI void          LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma);
  950. LCMSAPI void          LCMSEXPORT cmsFreeGammaTriple(LPGAMMATABLE Gamma[3]);
  951. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsDupGamma(LPGAMMATABLE Src);
  952. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma);
  953. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma,  LPGAMMATABLE OutGamma);
  954. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma,  LPGAMMATABLE OutGamma, int nPoints);
  955. LCMSAPI LCMSBOOL      LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
  956. LCMSAPI double        LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t);
  957. LCMSAPI double        LCMSEXPORT cmsEstimateGammaEx(LPWORD Table, int nEntries, double Thereshold); 
  958. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig);
  959. LCMSAPI LPGAMMATABLE  LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSignature sig);
  960.  
  961. // Access to Profile data.
  962.  
  963. LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
  964. LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
  965. LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
  966. LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile);
  967. LCMSAPI DWORD         LCMSEXPORT cmsTakeHeaderFlags(cmsHPROFILE hProfile);
  968. LCMSAPI DWORD         LCMSEXPORT cmsTakeHeaderAttributes(cmsHPROFILE hProfile);
  969.  
  970. LCMSAPI void          LCMSEXPORT cmsSetLanguage(const char LanguageCode[4], const char CountryCode[4]);
  971. LCMSAPI const char*   LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile);
  972. LCMSAPI const char*   LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile);
  973. LCMSAPI const char*   LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile);
  974. LCMSAPI const char*   LCMSEXPORT cmsTakeManufacturer(cmsHPROFILE hProfile);
  975. LCMSAPI const char*   LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile);
  976. LCMSAPI const char*   LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile);
  977. LCMSAPI const BYTE*   LCMSEXPORT cmsTakeProfileID(cmsHPROFILE hProfile);
  978.  
  979. LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
  980. LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
  981.  
  982. LCMSAPI LCMSBOOL      LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
  983. LCMSAPI int           LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile);
  984.  
  985. LCMSAPI LCMSBOOL      LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len);
  986.                                                   
  987. LCMSAPI int           LCMSEXPORT cmsReadICCTextEx(cmsHPROFILE hProfile, icTagSignature sig, char *Text, size_t size);
  988. LCMSAPI int           LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Text);
  989.  
  990.  
  991. #define LCMS_DESC_MAX     512
  992.  
  993. typedef struct {
  994.  
  995.             icSignature                 deviceMfg;      
  996.             icSignature                 deviceModel;                
  997.             icUInt32Number              attributes[2];     
  998.             icTechnologySignature       technology;     
  999.             
  1000.             char Manufacturer[LCMS_DESC_MAX];
  1001.             char Model[LCMS_DESC_MAX];
  1002.  
  1003.     } cmsPSEQDESC, FAR *LPcmsPSEQDESC;
  1004.  
  1005. typedef struct {
  1006.  
  1007.             int n;
  1008.             cmsPSEQDESC seq[1];
  1009.  
  1010.     } cmsSEQ, FAR *LPcmsSEQ;
  1011.  
  1012.  
  1013. LCMSAPI LPcmsSEQ      LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile);
  1014. LCMSAPI void          LCMSEXPORT cmsFreeProfileSequenceDescription(LPcmsSEQ pseq);
  1015.  
  1016.  
  1017. // Translate form/to our notation to ICC 
  1018. LCMSAPI icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation);
  1019. LCMSAPI int                   LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace);
  1020. LCMSAPI int                   LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace);
  1021. LCMSAPI LCMSBOOL              LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile);
  1022.  
  1023. // How profiles may be used
  1024. #define LCMS_USED_AS_INPUT      0
  1025. #define LCMS_USED_AS_OUTPUT     1
  1026. #define LCMS_USED_AS_PROOF      2
  1027.  
  1028. LCMSAPI LCMSBOOL             LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection);
  1029.  
  1030. LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
  1031. LCMSAPI icColorSpaceSignature   LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
  1032. LCMSAPI icProfileClassSignature LCMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);
  1033. LCMSAPI DWORD                   LCMSEXPORT cmsGetProfileICCversion(cmsHPROFILE hProfile);
  1034. LCMSAPI void                    LCMSEXPORT cmsSetProfileICCversion(cmsHPROFILE hProfile, DWORD Version);
  1035. LCMSAPI icInt32Number           LCMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile);
  1036. LCMSAPI icTagSignature          LCMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, icInt32Number n);
  1037.  
  1038.  
  1039. LCMSAPI void          LCMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, icProfileClassSignature sig);
  1040. LCMSAPI void          LCMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig);
  1041. LCMSAPI void          LCMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs);
  1042. LCMSAPI void          LCMSEXPORT cmsSetRenderingIntent(cmsHPROFILE hProfile, int RenderingIntent);
  1043. LCMSAPI void          LCMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, DWORD Flags);
  1044. LCMSAPI void          LCMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, DWORD Flags);
  1045. LCMSAPI void          LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID);
  1046.  
  1047. // Intents
  1048.  
  1049. #define INTENT_PERCEPTUAL                 0
  1050. #define INTENT_RELATIVE_COLORIMETRIC      1
  1051. #define INTENT_SATURATION                 2
  1052. #define INTENT_ABSOLUTE_COLORIMETRIC      3
  1053.  
  1054. // Flags
  1055.  
  1056. #define cmsFLAGS_MATRIXINPUT              0x0001
  1057. #define cmsFLAGS_MATRIXOUTPUT             0x0002
  1058. #define cmsFLAGS_MATRIXONLY               (cmsFLAGS_MATRIXINPUT|cmsFLAGS_MATRIXOUTPUT)
  1059.  
  1060. #define cmsFLAGS_NOWHITEONWHITEFIXUP      0x0004    // Don't hot fix scum dot   
  1061. #define cmsFLAGS_NOPRELINEARIZATION       0x0010    // Don't create prelinearization tables
  1062.                                                     // on precalculated transforms (internal use)
  1063.  
  1064. #define cmsFLAGS_GUESSDEVICECLASS         0x0020    // Guess device class (for transform2devicelink)
  1065.  
  1066. #define cmsFLAGS_NOTCACHE                 0x0040    // Inhibit 1-pixel cache
  1067.  
  1068. #define cmsFLAGS_NOTPRECALC               0x0100    
  1069. #define cmsFLAGS_NULLTRANSFORM            0x0200    // Don't transform anyway
  1070. #define cmsFLAGS_HIGHRESPRECALC           0x0400    // Use more memory to give better accurancy
  1071. #define cmsFLAGS_LOWRESPRECALC            0x0800    // Use less memory to minimize resouces
  1072.  
  1073.  
  1074. #define cmsFLAGS_WHITEBLACKCOMPENSATION   0x2000    
  1075. #define cmsFLAGS_BLACKPOINTCOMPENSATION   cmsFLAGS_WHITEBLACKCOMPENSATION   
  1076.  
  1077. // Proofing flags
  1078.  
  1079. #define cmsFLAGS_GAMUTCHECK               0x1000    // Out of Gamut alarm
  1080. #define cmsFLAGS_SOFTPROOFING             0x4000    // Do softproofing
  1081.  
  1082. // Black preservation         
  1083.  
  1084. #define cmsFLAGS_PRESERVEBLACK            0x8000
  1085.  
  1086. // CRD special
  1087.  
  1088. #define cmsFLAGS_NODEFAULTRESOURCEDEF     0x01000000
  1089.  
  1090. // Gridpoints
  1091.  
  1092. #define cmsFLAGS_GRIDPOINTS(n)           (((n) & 0xFF) << 16)
  1093.  
  1094.  
  1095. // Transforms
  1096.  
  1097. LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
  1098.                                                DWORD InputFormat,
  1099.                                                cmsHPROFILE Output,
  1100.                                                DWORD OutputFormat,
  1101.                                                int Intent,
  1102.                                                DWORD dwFlags);
  1103.  
  1104. LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,
  1105.                                                DWORD InputFormat,
  1106.                                                cmsHPROFILE Output,
  1107.                                                DWORD OutputFormat,
  1108.                                                cmsHPROFILE Proofing,
  1109.                                                int Intent,
  1110.                                                int ProofingIntent,
  1111.                                                DWORD dwFlags);
  1112.  
  1113. LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
  1114.                                                                 int nProfiles,
  1115.                                                                 DWORD InputFormat,
  1116.                                                                 DWORD OutputFormat,
  1117.                                                                 int Intent,
  1118.                                                                 DWORD dwFlags);
  1119.  
  1120. LCMSAPI void         LCMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);
  1121.  
  1122. LCMSAPI void         LCMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
  1123.                                                  LPVOID InputBuffer,
  1124.                                                  LPVOID OutputBuffer,
  1125.                                                  unsigned int Size);
  1126.  
  1127. LCMSAPI void         LCMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, DWORD InputFormat, DWORD dwOutputFormat);
  1128.  
  1129. LCMSAPI void         LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b);
  1130. LCMSAPI void         LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b);
  1131.  
  1132.  
  1133. // Adaptation state for absolute colorimetric intent
  1134.  
  1135. LCMSAPI double       LCMSEXPORT cmsSetAdaptationState(double d);
  1136.  
  1137.  
  1138. // Primary preservation strategy
  1139.  
  1140. #define LCMS_PRESERVE_PURE_K    0
  1141. #define LCMS_PRESERVE_K_PLANE   1
  1142.  
  1143. LCMSAPI int LCMSEXPORT cmsSetCMYKPreservationStrategy(int n);
  1144.  
  1145. // Named color support
  1146. typedef struct {                
  1147.                 char Name[MAX_PATH];
  1148.                 WORD PCS[3];
  1149.                 WORD DeviceColorant[MAXCHANNELS];
  1150.                 
  1151.  
  1152.         } cmsNAMEDCOLOR, FAR* LPcmsNAMEDCOLOR;
  1153.  
  1154. typedef struct {
  1155.                 int nColors;                
  1156.                 int Allocated;
  1157.                 int ColorantCount;  
  1158.                 char Prefix[33];
  1159.                 char Suffix[33];     
  1160.                 
  1161.                 cmsNAMEDCOLOR List[1];                
  1162.  
  1163.         } cmsNAMEDCOLORLIST, FAR* LPcmsNAMEDCOLORLIST;
  1164.  
  1165. // Named color support
  1166.  
  1167. LCMSAPI int      LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform);
  1168. LCMSAPI LCMSBOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix);
  1169. LCMSAPI int      LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name);
  1170.  
  1171. // Colorant tables
  1172.  
  1173. LCMSAPI LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile, icTagSignature sig);
  1174.  
  1175. // Profile creation 
  1176.  
  1177. LCMSAPI LCMSBOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, const void* data);
  1178.  
  1179. // Converts a transform to a devicelink profile
  1180. LCMSAPI cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags);
  1181.  
  1182. // Set the 'save as 8-bit' flag
  1183. LCMSAPI void LCMSEXPORT _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth);
  1184.  
  1185.  
  1186. // Save profile
  1187. LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName);
  1188. LCMSAPI LCMSBOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, 
  1189.                                                                 size_t* BytesNeeded);
  1190.  
  1191.  
  1192.  
  1193. // PostScript ColorRenderingDictionary and ColorSpaceArray
  1194.  
  1195. LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
  1196. LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRD(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
  1197. LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, int Intent, DWORD dwFlags, LPVOID Buffer, DWORD dwBufferLen);
  1198.  
  1199.  
  1200. // Error handling
  1201.  
  1202. #define LCMS_ERROR_ABORT    0
  1203. #define LCMS_ERROR_SHOW     1
  1204. #define LCMS_ERROR_IGNORE   2
  1205.  
  1206. LCMSAPI int LCMSEXPORT cmsErrorAction(int nAction);
  1207.  
  1208. #define LCMS_ERRC_WARNING        0x1000
  1209. #define LCMS_ERRC_RECOVERABLE    0x2000
  1210. #define LCMS_ERRC_ABORTED        0x3000
  1211.  
  1212. typedef int (* cmsErrorHandlerFunction)(int ErrorCode, const char *ErrorText);
  1213.  
  1214. LCMSAPI void LCMSEXPORT cmsSetErrorHandler(cmsErrorHandlerFunction Fn);
  1215.  
  1216.  
  1217. // LUT manipulation
  1218.  
  1219.  
  1220. typedef struct _lcms_LUT_struc LUT, FAR* LPLUT; // opaque pointer
  1221.  
  1222. LCMSAPI LPLUT  LCMSEXPORT cmsAllocLUT(void);
  1223. LCMSAPI LPLUT  LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nTable);
  1224. LCMSAPI LPLUT  LCMSEXPORT cmsAlloc3DGrid(LPLUT Lut, int clutPoints, int inputChan, int outputChan);
  1225. LCMSAPI LPLUT  LCMSEXPORT cmsSetMatrixLUT(LPLUT Lut, LPMAT3 M);
  1226. LCMSAPI LPLUT  LCMSEXPORT cmsSetMatrixLUT4(LPLUT Lut, LPMAT3 M, LPVEC3 off, DWORD dwFlags);
  1227. LCMSAPI void   LCMSEXPORT cmsFreeLUT(LPLUT Lut);
  1228. LCMSAPI void   LCMSEXPORT cmsEvalLUT(LPLUT Lut, WORD In[], WORD Out[]);
  1229. LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Result[], LPWORD Hint);
  1230. LCMSAPI LPLUT  LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig);
  1231. LCMSAPI LPLUT  LCMSEXPORT cmsDupLUT(LPLUT Orig);
  1232.  
  1233. // LUT Sampling
  1234.  
  1235. typedef int (* _cmsSAMPLER)(register WORD In[],
  1236.                             register WORD Out[],
  1237.                             register LPVOID Cargo);
  1238.  
  1239. #define SAMPLER_HASTL1      LUT_HASTL1
  1240. #define SAMPLER_HASTL2      LUT_HASTL2
  1241. #define SAMPLER_INSPECT     0x01000000
  1242.  
  1243. LCMSAPI int LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags);
  1244.  
  1245. // Formatters
  1246.  
  1247. typedef unsigned char* (* cmsFORMATTER)(register void* CMMcargo,
  1248.                                         register WORD ToUnroll[],
  1249.                                         register LPBYTE Buffer);
  1250.  
  1251. LCMSAPI void LCMSEXPORT cmsSetUserFormatters(cmsHTRANSFORM hTransform, DWORD dwInput,  cmsFORMATTER Input,
  1252.                                                                DWORD dwOutput, cmsFORMATTER Output);
  1253.  
  1254. LCMSAPI void LCMSEXPORT cmsGetUserFormatters(cmsHTRANSFORM hTransform, 
  1255.                                                                LPDWORD InputFormat, cmsFORMATTER* Input, 
  1256.                                                                LPDWORD OutputFormat, cmsFORMATTER* Output);
  1257.  
  1258.  
  1259. // IT8.7 / CGATS.17-200x handling
  1260.  
  1261. LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8Alloc(void);
  1262. LCMSAPI void            LCMSEXPORT cmsIT8Free(LCMSHANDLE IT8);
  1263.  
  1264. // Tables
  1265.  
  1266. LCMSAPI int             LCMSEXPORT cmsIT8TableCount(LCMSHANDLE IT8);
  1267. LCMSAPI int             LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable);
  1268.  
  1269. // Persistence
  1270. LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
  1271. LCMSAPI LCMSHANDLE      LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
  1272. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
  1273. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded);
  1274.  
  1275. // Properties
  1276. LCMSAPI const char*     LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
  1277. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
  1278.  
  1279. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
  1280.  
  1281. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
  1282. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
  1283. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
  1284.  
  1285. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
  1286.  
  1287.  
  1288. LCMSAPI const char*     LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
  1289. LCMSAPI double          LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
  1290. LCMSAPI int             LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames);
  1291.  
  1292. // Datasets
  1293.  
  1294. LCMSAPI const char*     LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);                                                
  1295. LCMSAPI double          LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int row, int col);
  1296.  
  1297. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, 
  1298.                                                 const char* Val);
  1299.  
  1300. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, 
  1301.                                                 double Val);
  1302.  
  1303. LCMSAPI const char*     LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);                                                
  1304.  
  1305.  
  1306. LCMSAPI double          LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
  1307.  
  1308. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
  1309.                                                 const char* cSample,
  1310.                                                 const char *Val);
  1311.  
  1312. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
  1313.                                                 const char* cSample,
  1314.                                                 double Val);
  1315.  
  1316. LCMSAPI int             LCMSEXPORT cmsIT8GetDataFormat(LCMSHANDLE hIT8, const char* cSample);
  1317. LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
  1318. LCMSAPI int             LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
  1319.  
  1320.  
  1321. LCMSAPI const char*     LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
  1322.  
  1323. // The LABEL extension
  1324.  
  1325. LCMSAPI int             LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
  1326.  
  1327. // Formatter for double
  1328. LCMSAPI void            LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
  1329.  
  1330.  
  1331. // ***************************************************************************
  1332. // End of Little cms API From here functions are private
  1333. // You can use them only if using static libraries, and at your own risk of
  1334. // be stripped or changed at futures releases.
  1335.  
  1336. #ifndef LCMS_APIONLY
  1337.  
  1338.  
  1339. // Compatibility with anterior versions-- not needed anymore
  1340. //  -- Morge
  1341.  
  1342. LCMSAPI void          LCMSEXPORT cmsLabEncoded2Float(LPcmsCIELab Lab, const WORD wLab[3]);
  1343. LCMSAPI void          LCMSEXPORT cmsLabEncoded2Float4(LPcmsCIELab Lab, const WORD wLab[3]);
  1344. LCMSAPI void          LCMSEXPORT cmsFloat2LabEncoded(WORD wLab[3], const cmsCIELab* Lab);
  1345. LCMSAPI void          LCMSEXPORT cmsFloat2LabEncoded4(WORD wLab[3], const cmsCIELab* Lab);
  1346. LCMSAPI void          LCMSEXPORT cmsXYZEncoded2Float(LPcmsCIEXYZ fxyz, const WORD XYZ[3]);
  1347. LCMSAPI void          LCMSEXPORT cmsFloat2XYZEncoded(WORD XYZ[3], const cmsCIEXYZ* fXYZ);
  1348.  
  1349.  
  1350. // Profiling Extensions --- Would be removed from API in future revisions
  1351.  
  1352. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile,  icTagSignature sig, const char* Text);
  1353. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile,   icTagSignature sig, const cmsCIEXYZ* XYZ);
  1354. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile,   icTagSignature sig, const void* lut);
  1355. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction);
  1356. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm);
  1357. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq);
  1358. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
  1359. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime);
  1360. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
  1361. LCMSAPI LCMSBOOL      LCMSEXPORT _cmsAddChromaticAdaptationTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* mat);
  1362.  
  1363. // --------------------------------------------------------------------------------------------------- Inline functions
  1364.  
  1365. // Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon 
  1366. // note than this only works in the range ..-32767...+32767 because 
  1367. // mantissa is interpreted as 15.16 fixed point.
  1368. // The union is to avoid pointer aliasing overoptimization.
  1369.  
  1370. LCMS_INLINE int _cmsQuickFloor(double val)
  1371. {
  1372. #ifdef USE_DEFAULT_FLOOR_CONVERSION
  1373.     return (int) floor(val);
  1374. #else
  1375.     const double _lcms_double2fixmagic = 68719476736.0 * 1.5;  // 2^36 * 1.5, (52-16=36) uses limited precision to floor
  1376.     union {
  1377.         double val;
  1378.         int halves[2];
  1379.     } temp;
  1380.     
  1381.     temp.val = val + _lcms_double2fixmagic;
  1382.  
  1383.     
  1384. #ifdef USE_BIG_ENDIAN
  1385.     return temp.halves[1] >> 16;
  1386. #else
  1387.     return temp.halves[0] >> 16;
  1388. #endif
  1389. #endif
  1390. }
  1391.  
  1392.  
  1393.  
  1394. // Clamp with saturation
  1395.  
  1396. LCMS_INLINE WORD _cmsClampWord(int in)
  1397. {
  1398.        if (in < 0) return 0;
  1399.        if (in > 0xFFFF) return 0xFFFFU;   // Including marker
  1400.        return (WORD) in;
  1401. }
  1402.  
  1403. #ifndef LCMS_USER_ALLOC
  1404.  
  1405. // Low-level alloc hook
  1406.  
  1407. LCMS_INLINE void* _cmsMalloc(size_t size)
  1408. {
  1409.     if (size > ((size_t) 1024*1024*500)) return NULL;  // Never allow over 500Mb
  1410.     if (size < 0) return NULL;              // Prevent signed size_t exploits
  1411.  
  1412.     return (void*) malloc(size);
  1413. }
  1414.  
  1415.  
  1416. LCMS_INLINE void _cmsFree(void *Ptr)
  1417. {
  1418.     if (Ptr) free(Ptr);    
  1419. }
  1420.  
  1421. #endif
  1422.  
  1423. // ------------------------------------------------------------------------------------------- end of inline functions
  1424.  
  1425. // Signal error from inside lcms code
  1426.  
  1427. void cdecl cmsSignalError(int ErrorCode, const char *ErrorText, ...);
  1428.  
  1429. // Alignment handling (needed in ReadLUT16 and ReadLUT8)
  1430.  
  1431. typedef struct {
  1432.         icS15Fixed16Number a;
  1433.         icUInt16Number     b;
  1434.  
  1435.        } _cmsTestAlign16;
  1436.  
  1437. #define SIZEOF_UINT16_ALIGNED (sizeof(_cmsTestAlign16) - sizeof(icS15Fixed16Number))
  1438.  
  1439. typedef struct {
  1440.         icS15Fixed16Number a;
  1441.         icUInt8Number      b;
  1442.  
  1443.        } _cmsTestAlign8;
  1444.  
  1445. #define SIZEOF_UINT8_ALIGNED (sizeof(_cmsTestAlign8) - sizeof(icS15Fixed16Number))
  1446.  
  1447.  
  1448. // Fixed point
  1449.  
  1450.  
  1451. typedef icInt32Number Fixed32;       // Fixed 15.16 whith sign
  1452.  
  1453. #define INT_TO_FIXED(x)         ((x)<<16)
  1454. #define DOUBLE_TO_FIXED(x)      ((Fixed32) ((x)*65536.0+0.5))
  1455. #define FIXED_TO_INT(x)         ((x)>>16)
  1456. #define FIXED_REST_TO_INT(x)    ((x)& 0xFFFFU)
  1457. #define FIXED_TO_DOUBLE(x)      (((double)x)/65536.0)
  1458. #define ROUND_FIXED_TO_INT(x)   (((x)+0x8000)>>16)
  1459.  
  1460.  
  1461. Fixed32 cdecl FixedMul(Fixed32 a, Fixed32 b);
  1462. Fixed32 cdecl FixedSquare(Fixed32 a);
  1463.  
  1464.  
  1465. #ifdef USE_INLINE
  1466.  
  1467. LCMS_INLINE Fixed32 ToFixedDomain(int a)        { return a + ((a + 0x7fff) / 0xffff); }
  1468. LCMS_INLINE int     FromFixedDomain(Fixed32 a)  { return a - ((a + 0x7fff) >> 16); }   
  1469.  
  1470. #else
  1471.  
  1472. Fixed32 cdecl ToFixedDomain(int a);              // (a * 65536.0 / 65535.0)
  1473. int     cdecl FromFixedDomain(Fixed32 a);        // (a * 65535.0 + .5)
  1474.  
  1475. #endif
  1476.  
  1477. Fixed32 cdecl FixedLERP(Fixed32 a, Fixed32 l, Fixed32 h);
  1478. WORD    cdecl FixedScale(WORD a, Fixed32 s);
  1479.  
  1480. // Vector & Matrix operations. I'm using the notation frequently found in
  1481. // literature. Mostly 'Graphic Gems' samples. Not to be same routines.
  1482.  
  1483. // Vector members
  1484.  
  1485. #define VX      0
  1486. #define VY      1
  1487. #define VZ      2
  1488.  
  1489. typedef struct {                // Fixed 15.16 bits vector
  1490.         Fixed32 n[3];
  1491.         } WVEC3, FAR* LPWVEC3;
  1492.  
  1493. typedef struct {                // Matrix (Fixed 15.16)
  1494.         WVEC3 v[3];
  1495.         } WMAT3, FAR* LPWMAT3;
  1496.  
  1497.  
  1498.  
  1499. void      cdecl VEC3init(LPVEC3 r, double x, double y, double z);   // double version
  1500. void      cdecl VEC3initF(LPWVEC3 r, double x, double y, double z); // Fix32 version
  1501. void      cdecl VEC3toFix(LPWVEC3 r, LPVEC3 v);
  1502. void      cdecl VEC3fromFix(LPVEC3 r, LPWVEC3 v);
  1503. void      cdecl VEC3scaleFix(LPWORD r, LPWVEC3 Scale);
  1504. void      cdecl VEC3swap(LPVEC3 a, LPVEC3 b);
  1505. void      cdecl VEC3divK(LPVEC3 r, LPVEC3 v, double d);
  1506. void      cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d);
  1507. void      cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b);
  1508. void      cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b);
  1509. LCMSBOOL  cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance);
  1510. LCMSBOOL  cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance);
  1511. void      cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d);
  1512. void      cdecl VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v);
  1513. void      cdecl VEC3saturate(LPVEC3 v);
  1514. double    cdecl VEC3distance(LPVEC3 a, LPVEC3 b);
  1515. double    cdecl VEC3length(LPVEC3 a);
  1516.  
  1517. void      cdecl MAT3identity(LPMAT3 a);
  1518. void      cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
  1519. void      cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d);
  1520. int       cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
  1521. LCMSBOOL  cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
  1522. double    cdecl MAT3det(LPMAT3 m);
  1523. void      cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
  1524. void      cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
  1525. void      cdecl MAT3fromFix(LPMAT3 r, LPWMAT3 v);
  1526. void      cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v);
  1527. LCMSBOOL  cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance);
  1528. void      cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d);
  1529.  
  1530. // Is a table linear?
  1531.  
  1532. int  cdecl cmsIsLinear(WORD Table[], int nEntries);
  1533.  
  1534. // I hold this structures describing domain
  1535. // details mainly for optimization purposes.
  1536.  
  1537. struct _lcms_l16params_struc;
  1538.  
  1539. typedef void (* _cms3DLERP)(WORD Input[],
  1540.                             WORD Output[],
  1541.                             WORD LutTable[],
  1542.                             struct _lcms_l16params_struc* p);
  1543.  
  1544.  
  1545.  
  1546. typedef struct _lcms_l8opt_struc {      // Used on 8 bit interpolations
  1547.  
  1548.               unsigned int X0[256], Y0[256], Z0[256];
  1549.               WORD rx[256], ry[256], rz[256];
  1550.  
  1551.         } L8PARAMS, FAR* LPL8PARAMS;
  1552.  
  1553. typedef struct _lcms_l16params_struc {    // Used on 16 bits interpolations
  1554.  
  1555.                int nSamples;       // Valid on all kinds of tables
  1556.                int nInputs;        // != 1 only in 3D interpolation
  1557.                int nOutputs;       // != 1 only in 3D interpolation
  1558.  
  1559.                WORD Domain;
  1560.  
  1561.                int opta1, opta2;
  1562.                int opta3, opta4;     // Optimization for 3D LUT
  1563.                int opta5, opta6;
  1564.                int opta7, opta8;
  1565.  
  1566.                _cms3DLERP Interp3D; // The interpolation routine
  1567.                 
  1568.                 LPL8PARAMS p8;      // Points to some tables for 8-bit speedup              
  1569.  
  1570.                } L16PARAMS, *LPL16PARAMS;
  1571.  
  1572.  
  1573. void    cdecl cmsCalcL16Params(int nSamples, LPL16PARAMS p);
  1574. void    cdecl cmsCalcCLUT16Params(int nSamples, int InputChan, int OutputChan, LPL16PARAMS p);
  1575. void    cdecl cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan, 
  1576.                                             LCMSBOOL lUseTetrahedral, LPL16PARAMS p);
  1577.  
  1578. WORD    cdecl cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
  1579. Fixed32 cdecl cmsLinearInterpFixed(WORD Value1, WORD LutTable[], LPL16PARAMS p);
  1580. WORD    cdecl cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
  1581.  
  1582. void cdecl cmsTrilinearInterp16(WORD Input[],
  1583.                                 WORD Output[],
  1584.                                 WORD LutTable[],
  1585.                                 LPL16PARAMS p);
  1586.  
  1587. void cdecl cmsTetrahedralInterp16(WORD Input[],
  1588.                                   WORD Output[],
  1589.                                   WORD LutTable[], LPL16PARAMS p);
  1590.  
  1591. void cdecl cmsTetrahedralInterp8(WORD Input[],
  1592.                                  WORD Output[],
  1593.                                  WORD LutTable[],  LPL16PARAMS p);
  1594.  
  1595. // LUT handling
  1596.  
  1597. #define LUT_HASMATRIX       0x0001        // Do-op Flags
  1598. #define LUT_HASTL1          0x0002
  1599. #define LUT_HASTL2          0x0008
  1600. #define LUT_HAS3DGRID       0x0010
  1601.  
  1602. // New in rev 4.0 of ICC spec
  1603.  
  1604. #define LUT_HASMATRIX3     0x0020   // Matrix + offset for LutAToB
  1605. #define LUT_HASMATRIX4     0x0040   // Matrix + offset for LutBToA
  1606.  
  1607. #define LUT_HASTL3         0x0100   // '3' curves for LutAToB
  1608. #define LUT_HASTL4         0x0200   // '4' curves for LutBToA
  1609.  
  1610. // V4 emulation
  1611.  
  1612. #define LUT_V4_OUTPUT_EMULATE_V2    0x10000     // Is a V4 output LUT, emulating V2
  1613. #define LUT_V4_INPUT_EMULATE_V2     0x20000     // Is a V4 input LUT, emulating V2
  1614. #define LUT_V2_OUTPUT_EMULATE_V4    0x40000     // Is a V2 output LUT, emulating V4
  1615. #define LUT_V2_INPUT_EMULATE_V4     0x80000     // Is a V2 input LUT, emulating V4
  1616.  
  1617.  
  1618. struct _lcms_LUT_struc {
  1619.  
  1620.                DWORD wFlags;
  1621.                WMAT3 Matrix;                    // 15fixed16 matrix
  1622.  
  1623.                unsigned int InputChan;
  1624.                unsigned int OutputChan;
  1625.                unsigned int InputEntries;
  1626.                unsigned int OutputEntries;
  1627.                unsigned int cLutPoints;
  1628.  
  1629.                
  1630.                LPWORD L1[MAXCHANNELS];          // First linearization
  1631.                LPWORD L2[MAXCHANNELS];          // Last linearization
  1632.  
  1633.                LPWORD T;                        // 3D CLUT
  1634.                unsigned int Tsize;              // CLUT size in bytes
  1635.  
  1636.               // Parameters & Optimizations
  1637.  
  1638.                L16PARAMS In16params;
  1639.                L16PARAMS Out16params;
  1640.                L16PARAMS CLut16params;
  1641.  
  1642.                int Intent;                       // Accomplished intent
  1643.  
  1644.                // New for Rev 4.0 of spec (reserved)
  1645.  
  1646.                WMAT3 Mat3;
  1647.                WVEC3 Ofs3;
  1648.                LPWORD L3[MAXCHANNELS]; 
  1649.                L16PARAMS L3params;  
  1650.                unsigned int L3Entries;
  1651.  
  1652.                WMAT3 Mat4;
  1653.                WVEC3 Ofs4;
  1654.                LPWORD L4[MAXCHANNELS];                           
  1655.                L16PARAMS L4params;             
  1656.                unsigned int L4Entries;
  1657.  
  1658.                // Gray axes fixup. Only on v2 8-bit Lab LUT
  1659.  
  1660.                LCMSBOOL FixGrayAxes;
  1661.  
  1662.  
  1663.                // Parameters used for curve creation
  1664.  
  1665.                LCMSGAMMAPARAMS LCurvesSeed[4][MAXCHANNELS];
  1666.                
  1667.  
  1668.                }; // LUT, FAR* LPLUT;
  1669.  
  1670.  
  1671. LCMSBOOL         cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries);
  1672.  
  1673.  
  1674. // CRC of gamma tables
  1675.  
  1676. unsigned int _cmsCrc32OfGammaTable(LPGAMMATABLE Table);
  1677.  
  1678. // Sampled curves
  1679.  
  1680. LPSAMPLEDCURVE cdecl cmsAllocSampledCurve(int nItems);
  1681. void           cdecl cmsFreeSampledCurve(LPSAMPLEDCURVE p);
  1682. LPSAMPLEDCURVE cdecl cmsDupSampledCurve(LPSAMPLEDCURVE p);
  1683.  
  1684. LPSAMPLEDCURVE cdecl cmsConvertGammaToSampledCurve(LPGAMMATABLE Gamma, int nPoints);
  1685. LPGAMMATABLE   cdecl cmsConvertSampledCurveToGamma(LPSAMPLEDCURVE Sampled, double Max);
  1686.  
  1687. void           cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
  1688. void           cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
  1689. LCMSBOOL       cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
  1690. void           cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
  1691.  
  1692. LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
  1693.  
  1694. // Shaper/Matrix handling
  1695.  
  1696. #define MATSHAPER_HASMATRIX        0x0001        // Do-ops flags
  1697. #define MATSHAPER_HASSHAPER        0x0002
  1698. #define MATSHAPER_INPUT            0x0004        // Behaviour
  1699. #define MATSHAPER_OUTPUT           0x0008
  1700. #define MATSHAPER_HASINPSHAPER     0x0010
  1701. #define MATSHAPER_ALLSMELTED       (MATSHAPER_INPUT|MATSHAPER_OUTPUT)
  1702.  
  1703.  
  1704. typedef struct {
  1705.                DWORD dwFlags;
  1706.  
  1707.                WMAT3 Matrix;
  1708.  
  1709.                L16PARAMS p16;       // Primary curve
  1710.                LPWORD L[3];
  1711.                
  1712.                L16PARAMS p2_16;     // Secondary curve (used as input in smelted ones)
  1713.                LPWORD L2[3];
  1714.  
  1715.                } MATSHAPER, FAR* LPMATSHAPER;
  1716.  
  1717. LPMATSHAPER cdecl cmsAllocMatShaper(LPMAT3 matrix, LPGAMMATABLE Shaper[], DWORD Behaviour);
  1718. LPMATSHAPER cdecl cmsAllocMatShaper2(LPMAT3 matrix, LPGAMMATABLE In[], LPGAMMATABLE Out[], DWORD Behaviour);
  1719.  
  1720. void        cdecl cmsFreeMatShaper(LPMATSHAPER MatShaper);
  1721. void        cdecl cmsEvalMatShaper(LPMATSHAPER MatShaper, WORD In[], WORD Out[]);
  1722.  
  1723. LCMSBOOL    cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);
  1724.  
  1725. LPMATSHAPER cdecl cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile);
  1726. LPMATSHAPER cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile);
  1727.  
  1728.  
  1729.  
  1730. // White Point & Primary chromas handling
  1731. LCMSBOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll);
  1732. LCMSBOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt);
  1733. LCMSBOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt);
  1734.  
  1735. LCMSBOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile);
  1736.  
  1737. // Inter-PCS conversion routines. They assume D50 as white point.
  1738. void cdecl cmsXYZ2LabEncoded(WORD XYZ[3], WORD Lab[3]);
  1739. void cdecl cmsLab2XYZEncoded(WORD Lab[3], WORD XYZ[3]);
  1740.  
  1741. // Retrieve text representation of WP
  1742. void cdecl _cmsIdentifyWhitePoint(char *Buffer, LPcmsCIEXYZ WhitePt);
  1743.  
  1744. // Quantize to WORD in a (MaxSamples - 1) domain
  1745. WORD cdecl _cmsQuantizeVal(double i, int MaxSamples);
  1746.  
  1747. LPcmsNAMEDCOLORLIST  cdecl cmsAllocNamedColorList(int n);
  1748. int                  cdecl cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSignature sig);
  1749. void                 cdecl cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST List);
  1750. LCMSBOOL             cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]);
  1751.  
  1752.  
  1753. // I/O
  1754.  
  1755. #define MAX_TABLE_TAG       100
  1756.  
  1757. // This is the internal struct holding profile details.
  1758.  
  1759. typedef struct _lcms_iccprofile_struct {
  1760.  
  1761.               void* stream;   // Associated stream. If NULL,
  1762.                               // tags are supposed to be in
  1763.                               // memory rather than in a file.
  1764.  
  1765.                // Only most important items found in ICC profile
  1766.  
  1767.                icProfileClassSignature DeviceClass;
  1768.                icColorSpaceSignature   ColorSpace;
  1769.                icColorSpaceSignature   PCS;
  1770.                icRenderingIntent       RenderingIntent;
  1771.                icUInt32Number          flags;
  1772.                icUInt32Number          attributes;
  1773.                cmsCIEXYZ               Illuminant;
  1774.                
  1775.                // Additions for V4 profiles
  1776.  
  1777.                icUInt32Number          Version;
  1778.                MAT3                    ChromaticAdaptation;
  1779.                cmsCIEXYZ               MediaWhitePoint;
  1780.                cmsCIEXYZ               MediaBlackPoint;
  1781.                BYTE                    ProfileID[16];
  1782.  
  1783.  
  1784.                // Dictionary
  1785.  
  1786.                icInt32Number           TagCount;
  1787.                icTagSignature          TagNames[MAX_TABLE_TAG];
  1788.                size_t                  TagSizes[MAX_TABLE_TAG];
  1789.                size_t                  TagOffsets[MAX_TABLE_TAG];
  1790.                LPVOID                  TagPtrs[MAX_TABLE_TAG];
  1791.  
  1792.                char                    PhysicalFile[MAX_PATH];
  1793.                
  1794.                LCMSBOOL                IsWrite;
  1795.                LCMSBOOL                SaveAs8Bits;
  1796.  
  1797.                struct tm               Created;
  1798.  
  1799.                // I/O handlers
  1800.  
  1801.                size_t   (* Read)(void *buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc);
  1802.                
  1803.                LCMSBOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset);
  1804.                LCMSBOOL (* Close)(struct _lcms_iccprofile_struct* Icc);
  1805.                size_t   (* Tell)(struct _lcms_iccprofile_struct* Icc);
  1806.                
  1807.                // Writting
  1808.  
  1809.                LCMSBOOL (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr);
  1810.                            
  1811.                size_t UsedSpace;
  1812.  
  1813.  
  1814.               } LCMSICCPROFILE, FAR* LPLCMSICCPROFILE;
  1815.  
  1816.  
  1817. // Create an empty template for virtual profiles
  1818. cmsHPROFILE cdecl _cmsCreateProfilePlaceholder(void);
  1819.  
  1820. // Search into tag dictionary
  1821. icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, LCMSBOOL lSignalError);
  1822.  
  1823. // Search for a particular tag, replace if found or add new one else
  1824. LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const void* Init);
  1825.  
  1826.  
  1827. LPLCMSICCPROFILE cdecl _cmsCreateProfileFromFilePlaceholder(const char* FileName);
  1828. LPLCMSICCPROFILE cdecl _cmsCreateProfileFromMemPlaceholder(LPVOID MemPtr, DWORD dwSize);
  1829.  
  1830. void _cmsSetSaveToDisk(LPLCMSICCPROFILE Icc, const char* FileName);
  1831. void _cmsSetSaveToMemory(LPLCMSICCPROFILE Icc, LPVOID MemPtr, size_t dwSize);
  1832.  
  1833.  
  1834.  
  1835. // These macros unpack format specifiers into integers
  1836.  
  1837. #define T_COLORSPACE(s)       (((s)>>16)&31)
  1838. #define T_SWAPFIRST(s)        (((s)>>14)&1)
  1839. #define T_FLAVOR(s)           (((s)>>13)&1)
  1840. #define T_PLANAR(p)           (((p)>>12)&1)
  1841. #define T_ENDIAN16(e)         (((e)>>11)&1)
  1842. #define T_DOSWAP(e)           (((e)>>10)&1)
  1843. #define T_EXTRA(e)            (((e)>>7)&7)
  1844. #define T_CHANNELS(c)         (((c)>>3)&15)
  1845. #define T_BYTES(b)            ((b)&7)
  1846.  
  1847.  
  1848.  
  1849. // Internal XFORM struct
  1850. struct _cmstransform_struct;
  1851.  
  1852. // Full xform
  1853. typedef void (* _cmsCOLORCALLBACKFN)(struct _cmstransform_struct *Transform,
  1854.                                LPVOID InputBuffer,
  1855.                                LPVOID OutputBuffer, unsigned int Size);
  1856.  
  1857. // intermediate pass, from WORD[] to WORD[]
  1858.  
  1859. typedef void   (* _cmsADJFN)(WORD In[], WORD Out[], LPWMAT3 m, LPWVEC3 b);
  1860.  
  1861. typedef void   (* _cmsTRANSFN)(struct _cmstransform_struct *Transform,
  1862.                                WORD In[], WORD Out[]);
  1863.  
  1864. typedef void   (* _cmsCNVRT)(WORD In[], WORD Out[]);
  1865.  
  1866. typedef LPBYTE (* _cmsFIXFN)(register struct _cmstransform_struct *info,
  1867.                              register WORD ToUnroll[],
  1868.                              register LPBYTE Buffer);
  1869.  
  1870.  
  1871.  
  1872. // Transformation
  1873. typedef struct _cmstransform_struct {
  1874.  
  1875.                     // Keep formats for further reference
  1876.                     DWORD InputFormat, OutputFormat;
  1877.                    
  1878.                     DWORD StrideIn, StrideOut;      // Planar support
  1879.  
  1880.                     int Intent, ProofIntent;
  1881.                     int DoGamutCheck;
  1882.  
  1883.                    
  1884.                     cmsHPROFILE InputProfile;
  1885.                     cmsHPROFILE OutputProfile;
  1886.                     cmsHPROFILE PreviewProfile;
  1887.                    
  1888.                     icColorSpaceSignature EntryColorSpace;
  1889.                     icColorSpaceSignature ExitColorSpace;
  1890.  
  1891.                     DWORD dwOriginalFlags;      // Flags as specified by user
  1892.                 
  1893.                     WMAT3 m1, m2;       // Matrix holding inter PCS operation
  1894.                     WVEC3 of1, of2;     // Offset terms
  1895.  
  1896.                     _cmsCOLORCALLBACKFN xform;
  1897.  
  1898.                     // Steps in xFORM
  1899.  
  1900.                     _cmsFIXFN   FromInput;
  1901.                     _cmsTRANSFN FromDevice;
  1902.                     _cmsADJFN   Stage1;
  1903.                     _cmsADJFN   Stage2;
  1904.                     _cmsTRANSFN ToDevice;
  1905.                     _cmsFIXFN   ToOutput;
  1906.  
  1907.                     // LUTs
  1908.  
  1909.                     LPLUT Device2PCS;
  1910.                     LPLUT PCS2Device;
  1911.                     LPLUT Gamut;         // Gamut check
  1912.                     LPLUT Preview;       // Preview (Proof)
  1913.  
  1914.                     LPLUT DeviceLink;    // Precalculated grid - device link profile
  1915.                     LPLUT GamutCheck;    // Precalculated device -> gamut check
  1916.  
  1917.                     // Matrix/Shapers
  1918.  
  1919.                     LPMATSHAPER InMatShaper;
  1920.                     LPMATSHAPER OutMatShaper;
  1921.                     LPMATSHAPER SmeltMatShaper;
  1922.  
  1923.                     // Phase of Lab/XYZ, Abs/Rel
  1924.  
  1925.                     int Phase1, Phase2, Phase3;
  1926.  
  1927.                     // Named color table
  1928.                     
  1929.                     LPcmsNAMEDCOLORLIST NamedColorList;
  1930.                        
  1931.                     // Flag for transform involving v4 profiles
  1932.  
  1933.                     LCMSBOOL lInputV4Lab, lOutputV4Lab;
  1934.  
  1935.                     
  1936.                     // 1-pixel cache
  1937.  
  1938.                     WORD CacheIn[MAXCHANNELS];
  1939.                     WORD CacheOut[MAXCHANNELS];
  1940.  
  1941.                     double AdaptationState; // Figure for v4 incomplete state of adaptation
  1942.  
  1943.                     LCMS_RWLOCK_T rwlock;
  1944.  
  1945.                    } _cmsTRANSFORM,FAR *_LPcmsTRANSFORM;
  1946.  
  1947.  
  1948.  
  1949. // Packing & Unpacking
  1950.  
  1951. _cmsFIXFN cdecl _cmsIdentifyInputFormat(_LPcmsTRANSFORM xform,  DWORD dwInput);
  1952. _cmsFIXFN cdecl _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput);
  1953.  
  1954.  
  1955. // Conversion
  1956.  
  1957. #define XYZRel       0
  1958. #define LabRel       1
  1959.  
  1960.  
  1961. int cdecl cmsChooseCnvrt(int Absolute,
  1962.                  int Phase1, LPcmsCIEXYZ BlackPointIn,
  1963.                              LPcmsCIEXYZ WhitePointIn,
  1964.                              LPcmsCIEXYZ IlluminantIn,
  1965.                              LPMAT3 ChromaticAdaptationMatrixIn,
  1966.  
  1967.                  int Phase2, LPcmsCIEXYZ BlackPointOut,
  1968.                              LPcmsCIEXYZ WhitePointOut,
  1969.                              LPcmsCIEXYZ IlluminantOut,
  1970.                              LPMAT3 ChromaticAdaptationMatrixOut,
  1971.                  int DoBPC,
  1972.                  double AdaptationState,
  1973.                  _cmsADJFN *fn1,
  1974.                  LPWMAT3 wm, LPWVEC3 wof);
  1975.  
  1976.  
  1977.  
  1978. // Clamping & Gamut handling
  1979.  
  1980. LCMSBOOL cdecl   _cmsEndPointsBySpace(icColorSpaceSignature Space,
  1981.                             WORD **White, WORD **Black, int *nOutputs);
  1982.  
  1983. WORD * cdecl _cmsWhiteBySpace(icColorSpaceSignature Space);
  1984.  
  1985.  
  1986.  
  1987. WORD cdecl Clamp_L(Fixed32 in);
  1988. WORD cdecl Clamp_ab(Fixed32 in);
  1989.  
  1990. // Detection of black point
  1991.  
  1992. #define LCMS_BPFLAGS_D50_ADAPTED    0x0001
  1993.  
  1994. int cdecl cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent, DWORD dwFlags);
  1995.  
  1996. // choose reasonable resolution
  1997. int cdecl _cmsReasonableGridpointsByColorspace(icColorSpaceSignature Colorspace, DWORD dwFlags);
  1998.  
  1999. // Precalculate device link
  2000. LPLUT cdecl _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags);
  2001.  
  2002. // Precalculate black preserving device link
  2003. LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD dwFlags);
  2004.  
  2005. // Precalculate gamut check
  2006. LPLUT cdecl _cmsPrecalculateGamutCheck(cmsHTRANSFORM h);
  2007.  
  2008. // Hot fixes bad profiles
  2009. LCMSBOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p);
  2010.  
  2011. // Marks LUT as 8 bit on input
  2012. LPLUT cdecl _cmsBlessLUT8(LPLUT Lut);
  2013.  
  2014. // Compute gamut boundary
  2015. LPLUT cdecl _cmsComputeGamutLUT(cmsHPROFILE hProfile, int Intent);
  2016.  
  2017. // Compute softproof
  2018. LPLUT cdecl _cmsComputeSoftProofLUT(cmsHPROFILE hProfile, int nIntent);
  2019.  
  2020. // Find a suitable prelinearization tables, matching the given transform
  2021. void cdecl _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransforms, LPLUT Grid);
  2022.  
  2023.  
  2024. // Build a tone curve for K->K' if possible (only works on CMYK)
  2025. LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints);
  2026.  
  2027. // These are two VITAL macros, from converting between 8 and 16 bit
  2028. // representation. 
  2029.  
  2030. #define RGB_8_TO_16(rgb) (WORD) ((((WORD) (rgb)) << 8)|(rgb)) 
  2031. #define RGB_16_TO_8(rgb) (BYTE) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF)
  2032.  
  2033.  
  2034. #endif  // LCMS_APIONLY
  2035.  
  2036.  
  2037. #define __cms_H
  2038.  
  2039. #ifdef __cplusplus
  2040. }
  2041. #endif
  2042.  
  2043. #endif
  2044.  
  2045.